﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FrbaCommerce.Clases;
using FrbaCommerce.Facturar_Publicaciones;

namespace FrbaCommerce.Facturar_Publicaciones
{
    public partial class FacturarPublicacion : Form
    {
        Usuario user;
        List<Publicacion> publicaciones;
        List<FacturaItem> itemsFactura;
        Tarjeta tarjeta;
        int publicacionesFaltantes;
        //decimal totalFactura;
        public FacturarPublicacion(Usuario user)
        {
            InitializeComponent();
            this.user = user;
            CargarMediosDePagos();
            CargarNumFactura();            
        }

        private void btnSeleccionar_Click(object sender, EventArgs e)
        {
            SeleccionarPublicacion seleccion = new SeleccionarPublicacion(this.user);
            seleccion.FormClosed += new FormClosedEventHandler(seleccion_FormClosed);
            seleccion.ShowDialog();
            if (seleccion.publicacionesSelec != null)
            {
                publicaciones = seleccion.publicacionesSelec;
                publicacionesFaltantes = seleccion.totalPublicaciones - seleccion.publicacionesSelec.Count;

                foreach (Publicacion p in seleccion.publicacionesSelec)
                {
                    listPublicaciones.Items.Add(p.descripcion);
                }
            }
            this.dgvItemsFactura.DataSource = GenerarItemsDeFactura();
            itemsFactura = GenerarItemsDeFactura();
            this.dgvItemsFactura.Columns[0].Visible = false;
            this.dgvItemsFactura.Columns[1].Visible = false;
            this.dgvItemsFactura.Columns[2].HeaderText = "Codigo Publicación";
            this.dgvItemsFactura.Columns[3].HeaderText = "Cantidad";
            this.dgvItemsFactura.Columns[4].HeaderText = "Monto";
        }        

        private void seleccion_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.listPublicaciones.Items.Clear();            
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnFacturar_Click(object sender, EventArgs e)
        {
            if (ValidarCampos())
            {
                Factura factura = new Factura();
                factura.nro = Convert.ToInt32(txtNroFactura.Text);
                factura.usuario = this.user.Id;
                factura.fecha = Properties.Settings.Default.FechaSistema;
                factura.total = Convert.ToDecimal(txtPagar.Text);
                factura.id_pago = new Pago().ObtenerIdPorDescripcion(cmbPago.Text);
                factura.Guardar(factura); //Guardo Factura
                FacturaItem item = new FacturaItem(); //Guardo items
                item.Guardar(itemsFactura, factura.nro);
                if (factura.id_pago == 2)
                {
                    tarjeta.Guardar(tarjeta, factura.nro);
                }
                MessageBox.Show("Los datos han sido ingresados al sistema.", "Confirmacion", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        
                if (publicacionesFaltantes > 10)
                {
                    MessageBox.Show("Su usuario fue inhabilitado por no rendir mas de 10 facturas.\n", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    this.user.darBaja(); /*Inhabilito el usuario por rendiciones*/                    
                }
                this.Close();                
            }
        }

        private bool ValidarCampos()
        {            
            if (listPublicaciones.Items.Count == 0)
            {
                MessageBox.Show("Debe seleccionar alguna publicacion para facturar.\n", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            else if (cmbPago.SelectedItem == null)
            {
                MessageBox.Show("Debe seleccionar algun medio de pago.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            else if (cmbPago.Text.ToString() == "Tarjeta de Credito" && tarjeta == null)
            {
                MessageBox.Show("Debe cargar los datos de la tarjeta.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            else
            {
                return true;
            }
        }

        private void CargarMediosDePagos()
        {
            Pago pago = new Pago();
            pago.CargarComboPagos(cmbPago);            
        }

        private void CargarNumFactura()
        {
            Factura f = new Factura();
            f.CargarNroFactura(txtNroFactura);
        }        

        private List<FacturaItem> GenerarItemsDeFactura()
        {
            decimal totalFactura = 0;
            List<FacturaItem> facturasItems = new List<FacturaItem>();
            /* Primero Genero las Rendiciones de las publicaciones */
            foreach (Publicacion p in this.publicaciones)
            {
                FacturaItem f = new FacturaItem();                
                Visibilidad v = new Visibilidad().ObtenerVisibilidadPorCod(p.id_visibilidad);
                f.cod_public = p.codigo;
                f.cantidad = 1; // Chequear si no puedo agrupar
                f.monto = v.precio;
                totalFactura = f.monto + totalFactura;
                facturasItems.Add(f);
            }
            /* Busco las compras / subastas de las publicaciones */
            foreach (Publicacion  p in this.publicaciones)
            {
                FacturaItem f = new FacturaItem();
                Visibilidad v = new Visibilidad().ObtenerVisibilidadPorCod(p.id_visibilidad);
                List<Compra> compras;                
                f.cod_public = p.codigo;
                if (p.tipo == 1)
                {
                    compras = new Compra().obtenerComprasPublicacion(p.codigo);
                    if (compras.Count != 0)
                    {
                        foreach (Compra compra in compras)
                        {
                            f.monto = compra.cantidad * p.monto * (v.porcentaje);
                            f.cantidad = compra.cantidad;
                            totalFactura = f.monto + totalFactura;
                            facturasItems.Add(f);
                        }
                    }
                }
                else
                {
                    Compra ofertaFinalizada = new Compra().obtenerSubastaFinalizada(p.codigo);
                    if (ofertaFinalizada != null)
                    {
                        f.monto = p.stock * p.monto * (v.porcentaje);
                        totalFactura = f.monto + totalFactura;
                        f.cantidad = ofertaFinalizada.cantidad; //CHEQUEAR
                        facturasItems.Add(f);
                    }
                }                
            }            
            this.txtPagar.Text = totalFactura.ToString();
            return facturasItems;
        }        

        private void cmbPago_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbPago.Text=="Tarjeta de Credito")
            {
                btnCargarDatos.Visible = true;
            }
            else
            {
                btnCargarDatos.Visible = false;
            }
        }

        private void btnCargarDatos_Click(object sender, EventArgs e)
        {
            DatosTarjeta datosTarjeta= new DatosTarjeta();
            datosTarjeta.ShowDialog();
            tarjeta = datosTarjeta.datos;
        }
    }
}
